package net.hserver.admin.system.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.hserver.core.ioc.annotation.Autowired;
import cn.hserver.plugin.web.annotation.Controller;
import cn.hserver.plugin.web.annotation.GET;
import cn.hserver.plugin.web.annotation.POST;
import cn.hserver.plugin.web.annotation.PUT;
import cn.hserver.plugin.web.context.PartFile;
import cn.hserver.plugin.web.interfaces.HttpRequest;
import cn.hserver.plugin.web.interfaces.HttpResponse;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.excel.EasyExcel;
import com.mybatisflex.core.paginate.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.hserver.admin.system.common.MyCode;
import net.hserver.admin.system.common.MyResult;
import net.hserver.admin.system.config.Log;
import net.hserver.admin.system.dto.PwdDTO;
import net.hserver.admin.system.dto.UserExportDTO;
import net.hserver.admin.system.entity.User;
import net.hserver.admin.system.service.UserService;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;

import static net.hserver.admin.system.common.MyConstants.SUPER_ADMIN_ID;

/**
 * 用户信息接口
 *
*
 * @since 2022-06-12
 */
@Slf4j
@Controller("/user")
@RequiredArgsConstructor
@Log
public class UserController {

    @Autowired
    private UserService service;

    /**
     * 分页查询列表
     *
     * @param index  当前页|1
     * @param size   页大小|10
     * @param entity 查询实体
     * @return 所有数据
     */
    @SaCheckPermission("user:query")
    @POST("/page/{index}/{size}")
    public MyResult selectAll(User entity, Long index, Long size) {
        Page<User> page = new Page<>(index, size);
        return MyResult.of(service.page(page, Optional.ofNullable(entity).orElse(new User())));
    }

    /**
     * 不分页查询列表
     *
     * @param entity 实体对象
     * @return 查询结果
     */
    @SaCheckPermission("user:query")
    @POST("/list")
    public MyResult list( User entity) {
        return MyResult.of(service.list(Optional.ofNullable(entity).orElse(new User())));
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @SaCheckPermission("user:query")
    @GET("/user/{id}")
    public MyResult getById( Long id) {
        if (Objects.equals(id, SUPER_ADMIN_ID)) {
            if (!Objects.equals(StpUtil.getLoginIdAsLong(), id)) {
                return MyCode.ACCESS_DENIED.toResult("无权查询");
            }
        }
        return MyResult.of(service.getById(id));
    }

    /**
     * 新增单条数据
     *
     * @param entity 实体对象
     * @return 新增结果
     */
    @SaCheckPermission("user:add")
    @POST("")
    public MyResult save(User entity) {
        service.save(entity);
        return MyResult.success();
    }

    /**
     * 修改单条数据
     *
     * @param entity 实体对象
     * @return 修改结果
     */
    @SaCheckPermission("user:edit")
    @PUT("")
    public MyResult update(User entity) {
        service.update(entity);
        return MyResult.success();
    }

    /**
     * 批量删除数据
     *
     * @param ids 主键集合
     * @return 操作结果
     */
    @SaCheckPermission("user:delete")
    @POST("/delete")
    public MyResult deleteByIds(List<Long> ids) {
        service.deleteByIds(ids);
        return MyResult.success();
    }

    /**
     * 查询用户拥有的角色ID
     *
     * @param userId 用户ID
     */
    @GET("/roles/{userId}")
    public MyResult getRoles( Long userId) {
        return MyResult.of(service.selectRoleIdsByUserId(userId));
    }

    /**
     * 重置密码
     */
    @POST("/resetPwd")
    public MyResult resetPwd( User user) {
        service.resetPassword(user.getUserId());
        return MyResult.success();
    }

    /**
     * 修改密码
     */
    @POST("/changePwd")
    public MyResult changePwd( PwdDTO dto) {
        Long loginId = StpUtil.getLoginIdAsLong();
        service.changePwd(loginId, dto);
        return MyResult.success();
    }

    /**
     * 修改头像
     *
     * @param file 头像文件
     */
    @POST("/changeAvatar")
    public MyResult changeAvatar( HttpRequest file) throws IOException {

//        PartFile file1 = file.queryFile("file");
//
//        Long loginId = StpUtil.getLoginIdAsLong();
//        if (file1==null) return MyCode.DATA_VERIFY_ERROR.toResult("图片上传失败");
//        String path = FileUploadUtils.upload(AppConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);
//        service.changeAvatar(loginId, path);
        return MyResult.success();

    }

    /**
     * 导出excel
     *
     * @download
     */
    @POST("/export")
    public void export(HttpResponse response) {
        List<User> list = service.list(new User());
        List<UserExportDTO> list1 = list.stream().map(k -> {
            UserExportDTO dto = new UserExportDTO();
            BeanUtil.copyProperties(k, dto);
            return dto;
        }).toList();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        EasyExcel.write(baos, UserExportDTO.class).sheet("详情").doWrite(list1);
        byte[] byteArray = baos.toByteArray();
        response.setDownloadFile(new ByteArrayInputStream(byteArray),"详情.xlsx");
    }
}
